libobs_wrapper\display\window_manager/
show_hide.rs

1use std::sync::atomic::Ordering;
2
3use windows::Win32::UI::WindowsAndMessaging::{ShowWindow, SW_HIDE, SW_SHOWNA};
4
5use crate::display::ObsDisplayRef;
6
7#[cfg_attr(not(feature = "blocking"), async_trait::async_trait)]
8pub trait ShowHideTrait {
9    #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
10    async fn show(&mut self);
11    #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
12    async fn hide(&mut self);
13    #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
14    async fn is_visible(&self) -> bool;
15}
16
17#[cfg_attr(not(feature = "blocking"), async_trait::async_trait)]
18impl ShowHideTrait for ObsDisplayRef {
19    #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
20    async fn show(&mut self) {
21        log::trace!("show");
22        let m = self.manager.read().await;
23        unsafe {
24            let _ = ShowWindow(m.hwnd.0, SW_SHOWNA);
25        }
26
27        m.is_hidden.store(false, Ordering::Relaxed);
28    }
29
30    #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
31    async fn hide(&mut self) {
32        log::trace!("hide");
33        let m = self.manager.read().await;
34        unsafe {
35            let _ = ShowWindow(m.hwnd.0, SW_HIDE);
36        }
37
38        m.is_hidden.store(true, Ordering::Relaxed);
39    }
40
41    #[cfg_attr(feature = "blocking", remove_async_await::remove_async_await)]
42    async fn is_visible(&self) -> bool {
43        self.manager.read().await.is_hidden.load(Ordering::Relaxed)
44    }
45}